import sqlite3

from datetime import date, datetime

from typing import Optional, Union
from langchain_core.tools import tool

# 创建数据库连接
db = "../resource/travel2.sqlite"

@tool
def search_trip_recommendations(
    location: Optional[str] = None,
    name: Optional[str] = None,
    keywords: Optional[str] = None,
) -> list[dict]:
    """
    根据地点、名称和关键词搜索行程推荐。

    args：
        location（可选[str]）：行程推荐的地点。默认为 None。
        name（可选[str]）：行程推荐的名称。默认为 None。
        keywords（可选[str]）：与行程推荐相关的关键词。默认为 None。

    return：
        list[dict]：符合搜索条件的行程推荐字典列表。
    """
    conn = sqlite3.connect(db)
    cursor = conn.cursor()

    query = "SELECT * FROM trip_recommendations WHERE 1=1"
    params = []

    if location:
        query += " AND location LIKE ?"
        params.append(f"%{location}%")
    if name:
        query += " AND name LIKE ?"
        params.append(f"%{name}%")
    if keywords:
        keyword_list = keywords.split(",")
        keyword_conditions = " OR ".join(["keywords LIKE ?" for _ in keyword_list])
        query += f" AND ({keyword_conditions})"
        params.extend([f"%{keyword.strip()}%" for keyword in keyword_list])

    cursor.execute(query, params)
    results = cursor.fetchall()

    conn.close()

    return [
        dict(zip([column[0] for column in cursor.description], row)) for row in results
    ]


@tool
def book_excursion(recommendation_id: int) -> str:
    """
    通过推荐 ID 预订短途旅行。

    args：
        recommendation_id (int)：要预订的行程推荐 ID。

    return：
        str：一条消息，指示行程推荐是否已成功预订。
    """
    conn = sqlite3.connect(db)
    cursor = conn.cursor()

    cursor.execute(
        "UPDATE trip_recommendations SET booked = 1 WHERE id = ?", (recommendation_id,)
    )
    conn.commit()

    if cursor.rowcount > 0:
        conn.close()
        return f"旅行推荐 {recommendation_id} 已成功预订。"
    else:
        conn.close()
        return f"未找到 ID 为 {recommendation_id} 的旅行推荐。"


@tool
def update_excursion(recommendation_id: int, details: str) -> str:
    """
    根据 ID 更新行程推荐详情。

    参数：
        recommendation_id (int)：待更新行程推荐的 ID。
        details (str)：行程推荐的新详情。

    返回：
        str：指示行程推荐是否更新成功的消息。
    """
    conn = sqlite3.connect(db)
    cursor = conn.cursor()

    cursor.execute(
        "UPDATE trip_recommendations SET details = ? WHERE id = ?",
        (details, recommendation_id),
    )
    conn.commit()

    if cursor.rowcount > 0:
        conn.close()
        return f"旅行推荐 {recommendation_id} 已成功更新。"
    else:
        conn.close()
        return f"未找到 ID 为 {recommendation_id} 的旅行推荐。"


@tool
def cancel_excursion(recommendation_id: int) -> str:
    """
    根据 ID 取消行程推荐。

    args：
        recommendation_id (int)：要取消的行程推荐的 ID。

    return：
        str：一条消息，指示行程推荐是否已成功取消。
    """
    conn = sqlite3.connect(db)
    cursor = conn.cursor()

    cursor.execute(
        "UPDATE trip_recommendations SET booked = 0 WHERE id = ?", (recommendation_id,)
    )
    conn.commit()

    if cursor.rowcount > 0:
        conn.close()
        return f"行程推荐 {recommendation_id} 已成功取消。"
    else:
        conn.close()
        return f"未找到 ID 为 {recommendation_id} 的旅行推荐。"